package main

import "fmt"

func main() {
	/*
		Go语言的数据类型：

			数值类型：整数，浮点
				进行运算，加减乘除，打印
			字符串：
				可以获取单个字符，截取子串，遍历，strings包下的函数操作。。
			数组、切片、map：
				存储数据，修改数据，获取数据，遍历数据。。
			函数：
				加()，进行调用

			注意点：
				函数作为一种复合数据类型，可以看做是一种特殊的变量
					函数名(): 代表将函数进行调用，函数中的代码会全部执行，然后将 return 的结果返回给调用处
					函数名：代表指向函数体的内存地址
	*/
	//1.函数做一个变量
	fmt.Printf("%T\n", f1) //func()
	fmt.Println(f1)        // f1() f1 0x68fd40，看做函数名对应的函数体的地址

	//2.直接定义一个函数类型的变量
	var c func(int, int)
	fmt.Println(c) //<nil> 空

	c = f1         // 将 f1 的值(函数体的地址)赋值给 c
	fmt.Println(c) //0x68fd40

	f1(10, 20)
	c(10, 200) //c 也是函数类型的，加小括号也可以被调用

	res1 := f2        // 将 f2 的值（函数的地址）赋值给 res1，res1 和 f2 指向同一个函数体，res1 是一个函数类型
	res2 := f2(1, 2)  // 将 f2 函数进行调用，将函数的执行结果赋值给 res2，相当于：a+b，res2 是一个int类型
	fmt.Println(res1) //0xc0ff20
	fmt.Println(res2) //3

	fmt.Println(res1(10, 20)) //30
}

func f2(a, b int) int {
	return a + b
}

func f1(a, b int) {
	fmt.Println("喜羊羊最帅!", a, b)
}
